<?php
//使用模板，生成页面类
//实现功能：
//1、给定模板，读入模板：未给定模板，使用默认模板
//2、替换模板中的内容
//3、输出、生成静态页面
//创建: firmit  2009.10.13
//update: 2010-04-29
//        添加BaseClass的继承
//        修改类中关于错误的显示的部分
//        修改静态页面生的部分的代码，使用filebase类

//////////////////////////////////////////////////
//    Example:                                  //
//    //初始化，定义相关的变量                  //
//    define ("TMPL", "temp.html");             //
//                                              //
//    //实例化模板类                            //
//    $tmpl = new MC_StaticPageTmpl(TMPL);      //
//                                              //
//    //取得模板的html代码                      //
//    $tmpl->getTmplCode();                     //
//                                              //
//    //取得模板中可以替换的区域名称            //
//    $reg = $tmpl->getRegion();                //
//                                              //
//    //替换所有可替换部分为                    //
//    foreach($reg as $key=>$value){            //
//        $tmpl->setChgCnt($key, "aaaaaaaa");   //
//    }                                         //
//                                              //
//    //生成HTML页面，可以直接显示              //
//    $tmpl->CreateHtmlCode();                  //
//                                              //
//    //指定生成的静态页面的路径和名称          //
//    $tmpl->setHTMLPath("aaaaa.html");         //
//                                              //
//    //生成静态页面                            //
//    $tmpl->BuildHTMLFile();                   //
//////////////////////////////////////////////////

class MC_StaticPageTmpl extends  MC_Base{
    public $TmplPath;            //模板路径+名称
    public $StaticPath;            //静态页面路径+名称
    public $Control;            //控制参数
    private $TmplCode;            //存放模板代码
    private $aTmplRegion;        //存放模板中可以替换的部分列表
    private $HtmlCode;            //输出的代码
    private $DefaultTmpl;        //默认的模板代码
	
	//定义控制关键词
	//循环控制符
	const LOOP = "##LOOP";
	//选择控制符
	const BRANCH = "##BRANCH";
	//结束控制符
	const END = "##END";                        
    
    function __construct($_tp = "", $_ct=array()){
        $this->TmplPath = $_tp;
		$this->Control = $_ct; 
        $this->StaticPath = "";
        $this->TmplCode = "";
        $this->aTmplRegion = NULL;
        $this->HtmlCode = "";
        $this->DefaultTmpl = "<html><head><title>{title}</title></head><body>{content}</body></html>";
        $this->set("logFile", 'log/HtmlTmpl_error.log');
    }
    
    function __destruct(){
        $this->TmplPath = "";
		unset($this->Control); 
        $this->StaticPath = "";
        $this->TmplCode = "";
        $this->aTmplRegion = NULL;
        $this->HtmlCode = "";
        $this->DefaultTmpl = "";
    }
    
    //设置模板的路径与文件名
    function setTmplPath($_tp = ""){
        if($_tp != ""){
            $this->TmplPath = $_tp;
        }
    }
    
    //设置模板页面代码
    function setTmplCode($_tc = ""){
        if($_tc == ""){
        //如果$_tc为空，则读取模板路径指定的模板页或使用默认的模板
            if($this->TmplPath == ""){
                $this->TmplCode = $this->DefaultTmpl;
            }else{
                $this->TmplCode = file_get_contents($this->TmplPath);
            }
        }else{
        //如果$_tc不为空，使用$_tc的代码
            $this->TmplCode = $_tc;
        }
    }
    
    //取得模板页的代码
    function getTmplCode(){
        if($this->TmplCode == "")    $this->setTmplCode();
        return $this->TmplCode;
    }
    
    //取得模板中的替换部分列表
    function getRegion(){
        if($this->TmplCode == "")    $this->setTmplCode();
        
        //以下代码根据来自www.php.net的代码修改
        $reg = "\{\w+\}";
    
        mb_regex_encoding("UTF-8");
    
        mb_ereg_search_init($this->TmplCode, $reg);
        $r = mb_ereg_search();
    
        if(!$r)
        {
            return NULL;
        }
        else
        {
            $this->aTmplRegion = array();
            $r = mb_ereg_search_getregs(); //get first result
            do
            {
                if(!array_key_exists ($r[0], $this->aTmplRegion))
                    $this->aTmplRegion[$r[0]] = "";
                $r = mb_ereg_search_regs();//get next result
            }
            while($r);
            return $this->aTmplRegion;
        }
        //引用的代码结束
    }
    
    //设置替换的代码
    //$_rg 是模板中要替换的字段
    //$_cd 是替换成的内容
    function setChgCnt($_rg = "", $_cd = ""){
        if($_cd == ""){
            return false;
        }else{
            if($this->aTmplRegion == NULL) $this->aTmplRegion = array();
            if($_rg == ""){
                foreach($this->aTmplRegion as $_trg => $_tcd){
                    if($_tcd == ""){
                        $this->aTmplRegion[$_trg] = $_cd;
                        break;
                    }
                }
            }else{
                $this->aTmplRegion[$_rg] = $_cd    ;
            }
        }
    }
    
    //将实际内容替换模板内容
    function CreateHtmlCode(){
        if($this->aTmplRegion == NULL || (count($this->aTmplRegion)==0)){
            return "";
        }
        if($this->TmplCode == "" && $this->getTmplCode() == ""){
            return "";
        }
        $this->HtmlCode = $this->TmplCode;
        foreach($this->aTmplRegion as $_trg => $_tcd){
            $this->HtmlCode = mb_ereg_replace($_trg, $_tcd, $this->HtmlCode);
        }
        return $this->HtmlCode;
    }
    
    //设置静态页面的路径和文件名
    function setHTMLPath($_sp = ""){
        if($_sp != "")
            $this->StaticPath = $_sp;
    }
    
    //生成静态文件
    function BuildHTMLFile(){
        if($this->HtmlCode=="" && $this->CreateHtmlCode() == ""){
            return false;
        }else{
            if($this->file_write($this->StaticPath, $this->HtmlCode)===false){
                $this->errorLog("静态文件 {$this->StaticPath} 生成失败");
                return false;
            }
        }
        return true;
    }
    
    //输出内容到文件
    //@param $filename 文件名
    //@param $content 写入内容
    //@return 成功返回 true 失败返回 false
    function file_write($filename, $content=""){
        if($filename == ""){
            $this->errorLog("没有指定文件名");
            return false;
        }
        
        $f = new FileBase($filename);
        //备份已有的文件
        if(is_file($filename)){
            if($f->CopyFile() === false){
                $this->errorLog("文件 $filename 备份失败 ". $f->getErrMsg());
            }
        }
        return $f->WriteFile($content);
        
//        //确定是否存在重名的文件，如果有重名的目录，重命名
//        
//        if($f->WriteFile($content) === false);
//        if(is_file($filename)){
//            if (!copy($filename, ($filename.".bak"))) {
//                fnErrMsg(407);
//                exit(1);
//            }
//        }
//        //输出文件的句柄
//        $fwhandle = NULL;
//        
//        //打开要输出的文件
//        //确定是否存在重名的目录
//        if(is_dir($filename)){
//            fnErrMsg(406);
//            exit(1);
//        }
//        //确定是否存在重名的文件，如果有重名的目录，重命名
//        if(is_file($filename)){
//            if (!copy($filename, ($filename.".bak"))) {
//                fnErrMsg(407);
//                exit(1);
//            }
//        }
//        if(!$fwhandle = fopen($filename, "w")){
//            fnErrMsg(407);
//            exit(1);    
//        }
//        if (fwrite($fwhandle, $content) === FALSE) {
//            fclose($fwhandle);
//            fnErrMsg(408);
//            exit(1);    
//        }
//        fclose($fwhandle);
    }
}
?>
